#include "mystdio.h"
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>


myFILE *my_fopen(const char *pathname,const char *mode)
{
	int flag = 0;
	if(strcmp(mode ,"r") == 0)
	{
		flag |= O_RDONLY;
	}
	else if(strcmp(mode ,"w") == 0)
	{
		flag |= (O_CREAT|O_WRONLY|O_TRUNC);
	}
	else if(strcmp(mode ,"a") == 0)
	{
		flag |= (O_CREAT|O_WRONLY|O_APPEND);
		 
	}
	else 	return NULL;

	int fd = 0;
	if(flag & O_WRONLY)
	{
		umask(0);
		fd = open(pathname,flag,0666);
	}
	else
	{
		fd = open(pathname,flag);
	}
	if(fd < 0)	return NULL;

	myFILE *fp = (myFILE*)malloc(sizeof(myFILE));
	if(fp == NULL)	return NULL;

	fp->fileno = fd;
	fp->cap = SIZE;
	fp->pos = 0;
	fp->flush_mode = LINE_FLUSH;

	return fp;

}

void my_flush(myFILE* fp)
{
	if(fp->pos == 0)	return;
	write(fp->fileno,fp->outbuffer,fp->pos);	
	fp->pos = 0;
}


int my_fwrite(myFILE *fp,const char *str,int size)
{
	memcpy(fp->outbuffer+fp->pos,str,size);
	fp->pos += size;
	if((fp->flush_mode & LINE_FLUSH) && fp->outbuffer[fp->pos-1] == '\n')
	{
			my_flush(fp);
	}
	return size;
}
void my_close(myFILE *fp)
{
	my_flush(fp);
	close(fp->fileno);
	free(fp);
}
